Avgpooling

对NHWC格式的输入张量执行2D平均池化,并随后进行范围裁剪(Clip)激活。

该算子融合了两个步骤:

  1. 平均池化 (Average Pooling):

\[\text{Pool}_{i,j} = \frac{1}{k_h \times k_w} \sum_{m=0}^{k_h-1} \sum_{n=0}^{k_w-1} \text{Input}_{i \cdot s_h + m, j \cdot s_w + n}\]
  1. 裁剪激活 (Clipping Activation):

\[\text{Output} = \max(\min\_val, \min(\text{Pool}, \max\_val))\]
输入:
  • input - 输入张量的数据地址。格式: NHWC。

  • batch (N) - 批处理大小。

  • in_h (H) - 输入特征图的高度。

  • in_w (W) - 输入特征图的宽度。

  • channel (C) - 输入特征图的通道数。

  • win_h - 池化核的高度。

  • win_w - 池化核的宽度。

  • stride_h - 垂直方向的步长。

  • stride_w - 水平方向的步长。

  • pad_top - 上边距填充。

  • pad_bottom - 下边距填充。

  • pad_left - 左边距填充。

  • pad_right - 右边距填充。

  • min_val - 裁剪范围的最小值。

  • max_val - 裁剪范围的最大值。

  • core_mask - 核掩码。

输出:
  • output - 输出张量的数据地址。

支持平台:

FT78NE MT7004

备注

  • FT78NE 支持fp32, int8

  • MT7004 支持fp16, fp32

共享存储版本:

void i8_avgpool_fusion_s(int8_t *input, int8_t *output, int batch, int in_h, int in_w, int channel, int win_h, int win_w, int stride_h, int stride_w, int pad_top, int pad_bottom, int pad_left, int pad_right, int8_t min_val, int8_t max_val, int core_mask)
void fp_avgpool_fusion_s(float *input, float *output, int batch, int in_h, int in_w, int channel, int win_h, int win_w, int stride_h, int stride_w, int pad_top, int pad_bottom, int pad_left, int pad_right, float min_val, float max_val, int core_mask)
void hp_avgpool_fusion_s(half *input, half *output, int batch, int in_h, int in_w, int channel, int win_h, int win_w, int stride_h, int stride_w, int pad_top, int pad_bottom, int pad_left, int pad_right, half min_val, half max_val, int core_mask)

C调用示例:

 1//FT78NE示例
 2#include <stdio.h>
 3#include <avgpooling.h>
 4int main(int argc, char* argv[]) {
 5    float *input = (float *)0xA0000000;      // input在DDR空间
 6    float *output = (float *)0xB0000000;     // output
 7
 8    // Shape parameters
 9    int batch = 2;
10    int in_h = 224;
11    int in_w = 224;
12    int channel = 3;
13
14    // Pooling parameters
15    int win_h = 3, win_w = 3;
16    int stride_h = 2, stride_w = 2;
17    int pad_top = 1, pad_bottom = 1, pad_left = 1, pad_right = 1;
18
19    // Fusion parameters (e.g., for ReLU6 activation)
20    float min_val = 0.0f;
21    float max_val = 6.0f;
22
23    int core_mask = 0xff;
24
25    fp_avgpool_fusion_s(input, output, batch, in_h, in_w, channel,
26                        win_h, win_w, stride_h, stride_w,
27                        pad_top, pad_bottom, pad_left, pad_right,
28                        min_val, max_val, core_mask);
29    return 0;
30}

私有存储版本:

void i8_avgpool_fusion_p(int8_t *input, int8_t *output, int batch, int in_h, int in_w, int channel, int win_h, int win_w, int stride_h, int stride_w, int pad_top, int pad_bottom, int pad_left, int pad_right, int8_t min_val, int8_t max_val)
void fp_avgpool_fusion_p(float *input, float *output, int batch, int in_h, int in_w, int channel, int win_h, int win_w, int stride_h, int stride_w, int pad_top, int pad_bottom, int pad_left, int pad_right, float min_val, float max_val)
void hp_avgpool_fusion_p(half *input, half *output, int batch, int in_h, int in_w, int channel, int win_h, int win_w, int stride_h, int stride_w, int pad_top, int pad_bottom, int pad_left, int pad_right, half min_val, half max_val)

C调用示例:

 1//FT78NE示例
 2#include <stdio.h>
 3#include <avgpooling.h>
 4int main(int argc, char* argv[]) {
 5    float *input = (float *)0x10000000;      // input在L2空间
 6    float *output = (float *)0x10100000;     // output
 7
 8    // Shape parameters
 9    int batch = 2;
10    int in_h = 32;
11    int in_w = 32;
12    int channel = 16;
13
14    // Pooling parameters
15    int win_h = 2, win_w = 2;
16    int stride_h = 2, stride_w = 2;
17    int pad_top = 0, pad_bottom = 0, pad_left = 0, pad_right = 0;
18
19    // Fusion parameters
20    float min_val = -127.0f;
21    float max_val = 127.0f;
22
23    fp_avgpool_fusion_p(input, output, batch, in_h, in_w, channel,
24                        win_h, win_w, stride_h, stride_w,
25                        pad_top, pad_bottom, pad_left, pad_right,
26                        min_val, max_val);
27    return 0;
28}